Over recent years, the computing community developed a strong set of tools and methods used to analyze and monitor run-time behavior of a program. One type of performance analysis is referred to as instrumentation. Measurements such as basic-block coverage and function invocation counting can be accurately made using instrumentation. One specific type of code instrumentation is referred to as dynamic binary instrumentation. Dynamic binary instrumentation allows program instructions to be changed on-the-fly. Additionally, dynamic binary instrumentation, as opposed to static instrumentation, is performed at run-time of a program and only instruments those parts of an executable that are actually executed. This minimizes the overhead imposed by the instrumentation process itself. Furthermore, performance analysis tools based on dynamic binary instrumentation require no special preparation of an executable such as, for example, a modified build or link process.
Certain modern programming languages such as, for example, C++ offer the ability to inherit so called derived objects from other base objects. This concept is commonly known as inheritance in the object oriented programming domain. Often, these base and/or derived objects use what are known as virtual functions. Hence, it is possible in certain instances to make a call to a virtual function. To accomplish this, the compiler generates an array of function pointers, known as a virtual table, for each object type that contains at least one virtual function. During the virtual function call, this virtual table is indexed to obtain a function pointer, and then an indirect call is made using that function pointer. Such tables must be created because the actual function call made may not be determinable at compile time. Additionally, it is not possible, at present, to readily instrument or analyze such virtual function calls.
Furthermore, programmers are often interested in deciphering the type of call which is made to a function such as, for example, a virtual function. More specifically, various function call types such as, for example, direct function calls, indirect function calls, and virtual function calls have differing costs associated therewith. That is, the various function calls differ in terms of the cycles and/or instructions executed in performing the function call. Unfortunately, at present, there is no current method for determining the call type for a virtual function.
Thus, a need has arisen for a method and system for analyzing a virtual function including determining the type of call made to the virtual function.